/*
    SUSAN® - Sole of Unix Save ANything

   

   
*/

#ifndef BAREOS_SRC_LIB_THREAD_SPECIFIC_DATA_KEY_H_
#define BAREOS_SRC_LIB_THREAD_SPECIFIC_DATA_KEY_H_

#include "lib/berrno.h"

#include <mutex>

class ThreadSpecificDataKey {
 public:
  static pthread_key_t Key()
  {
    init_once();
    return key_;
  }

 private:
  static pthread_key_t key_;
  static std::once_flag once_flag;

  static void init_once()
  {
    try {
      static std::once_flag once_flag;
      std::call_once(once_flag, CreateKey);
    } catch (const std::system_error& e) {
      Jmsg1(nullptr, M_ABORT, 0,
            _("Could not call CreateThreadSpecificDataKey: %s\n"), e.what());
    }
  }

  static void CreateKey()
  {
    int status = pthread_key_create(&key_, nullptr);
    if (status != 0) {
      BErrNo be;
      Jmsg1(nullptr, M_ABORT, 0, _("pthread key create failed: ERR=%s\n"),
            be.bstrerror(status));
    }
  }
};

pthread_key_t ThreadSpecificDataKey::key_;

#endif  // BAREOS_SRC_LIB_THREAD_SPECIFIC_DATA_KEY_H_
